home *** CD-ROM | disk | FTP | other *** search
- ;;; -*- Mode: Lisp; Package: Maxima; Syntax: Common-Lisp; Base: 10 -*- ;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;; The data in this file contains enhancments. ;;;;;
- ;;; ;;;;;
- ;;; Copyright (c) 1984,1987 by William Schelter,University of Texas ;;;;;
- ;;; All rights reserved ;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;; (c) Copyright 1980 Massachusetts Institute of Technology ;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (in-package "MAXIMA")
- (macsyma-module sprdet)
-
- ;; THIS IS THE NEW DETERMINANT PACKAGE
-
- (DECLARE-TOP(SPECIAL X *ptr* *ptc* *blk* $SPARSE $RATMX ML* *DETSIGN* RZL*) (GENPREFIX ND))
-
- (DEFUN SPRDET(AX N)
- (DECLARE(FIXNUM N))
- (setq ax (get-array-pointer ax))
- (PROG ((J 0) RODR CODR BL DET (DM 0) (R 0) (I 0))
- (DECLARE(FIXNUM I J DM R))
- (SETQ DET 1.)
- (setq *PTR* (*ARRAY nil T (f1+ N)))
- (setq *PTC* (*ARRAY nil T (f1+ N)))
- (SETQ BL (TMLATTICE AX '*PTR* '*PTC* N))
- (COND ((NULL BL)(RETURN 0)))
- (SETQ RODR(APPLY(FUNCTION APPEND) BL))
- (SETQ CODR(MAPCAR (FUNCTION CADR) RODR))
- (SETQ RODR(MAPCAR (FUNCTION CAR) RODR))
- (SETQ DET(*(PRMUSIGN RODR)(PRMUSIGN CODR)))
- (SETQ BL (MAPCAR (FUNCTION LENGTH) BL ))
- LOOP1 (COND ((NULL BL) (RETURN DET)))
- (SETQ I (CAR BL) )(SETQ DM I)
- (setq *BLK* (*ARRAY nil T (f1+ DM)(f1+ DM)))
- (COND ((= DM 1.)
- (SETQ DET (GPTIMES DET (CAR(AREF AX (AREF *PTR* (f1+ R))(AREF *PTC*(f1+ R))))))
- (GO NEXT))
- ((= DM 2.)
- (SETQ DET (GPTIMES DET
- (GPDIFFERENCE
- (GPTIMES (CAR (AREF AX (AREF *PTR* (f1+ R))(AREF *PTC* (f1+ R))))
- (CAR (AREF AX (AREF *PTR* (f+ 2. R))(AREF *PTC* (f+ 2. R)))))
- (GPTIMES (CAR (AREF AX (AREF *PTR* (f1+ R))(AREF *PTC* (f+ 2. R))))
- (CAR (AREF AX (AREF *PTR* (f+ 2. R))(AREF *PTC* (f1+ R))))))))
- (GO NEXT)))
- LOOP2 (COND ((= I 0)(GO CMP)))
- (SETQ J DM)
- LOOP3 (COND ((= J 0) (SETQ I (f1- I)) (GO LOOP2)))
- (STORE (aref *BLK* I J)(CAR (AREF AX (AREF *PTR* (f+ R I)) (AREF *PTC*(f+ R J)))))
- (SETQ J (f1- J)) (GO LOOP3)
- CMP
- (SETQ DET (GPTIMES DET (TDBU '*BLK* DM)))
- NEXT
- (SETQ R(f+ R DM))
- (SETQ BL (CDR BL))
- (GO LOOP1)
- ))
-
- (DEFUN MINORL (X N L NZ)
- (DECLARE(FIXNUM N ))
- (PROG (ANS S RZL* (COL 1) ( N2 (// N 2.)) D DL Z A ELM RULE)
- (DECLARE(FIXNUM N2 COL ))
- (SETQ N2(f1- N2))
- (SETQ DL L L NIL NZ (CONS NIL NZ))
- L1(COND((NULL NZ)(RETURN ANS)))
- L3(SETQ Z (CAR NZ))
- (COND ((NULL L) (COND (DL (SETQ ANS (CONS DL ANS)))
- (T (RETURN NIL)))
- (SETQ NZ (CDR NZ) COL (f1+ COL) L DL DL NIL)
- (GO L1)))
- (SETQ A (CAAR L) )
- L2(COND((NULL Z)
- (COND (RULE (RPLACA (CAR L) (LIST A RULE))
- (SETQ RULE NIL) (SETQ L (CDR L)))
- ((NULL (CDR L))
- (RPLACA (CAR L) (LIST A 0))
- (SETQ L (CDR L)))
- (T (RPLACA L (CADR L))
- (RPLACD L (CDDR L))))
- (GO L3)))
- (SETQ ELM (CAR Z) Z (CDR Z))
- (SETQ S(SIGNNP ELM A))
- (COND(S(SETQ D (zl-DELETE ELM (COPY1 A)))
- (COND((MEMBERCAR D DL) (GO ON))
- (T
- (COND((OR(< COL N2)(NOT(SINGP X D COL N)))(SETQ DL (CONS (CONS D 1) DL))(GO ON)))
- ))))
- (GO L2)
- ON(SETQ RULE(CONS (LIST D S ELM (f1- COL)) RULE))
- (GO L2)))
-
- #-NIL
- (DECLARE-TOP(SPECIAL J))
-
- (DEFUN SINGP (X ML COL N)
- #+cl (DECLARE (FIXNUM COL N))
- ;#-Multics (DECLARE (FIXNUM COL N I J))
- (PROG (I (J col) L)
- (DECLARE (FIXNUM J))
- (SETQ L ML)
- (COND((NULL ML)(GO LOOP))
- (T (SETQ I (CAR ML) ML (CDR ML))))
- (COND((zl-MEMBER I RZL*)(RETURN T))
- ((ZROW X I COL N)(RETURN (SETQ RZL*(CONS I RZL*)))))
- LOOP(COND((> J N)(RETURN NIL))
- ((EVERY #'(LAMBDA (I) (EQUAL (AREF X I J) 0)) L)
- (RETURN T)))
- (SETQ J(f1+ J))(GO LOOP)
- ))
- #-NIL
- (DECLARE-TOP(UNSPECIAL J))
-
- (DEFUN TDBU (X N)
- (DECLARE(FIXNUM N))
- (PROG(A ML* NL NML DD)
- (SETQ *DETSIGN* 1)
- (setq x ( get-array-pointer x))
- (DETPIVOT X N)
- (SETQ X (get-array-pointer 'X*))
- ; (setq x ( get-array-pointer x))
- (SETQ NL (NZL X N))
- (COND ((MEMQ NIL NL)(RETURN 0)))
- (SETQ A (MINORL X N (LIST (CONS (NREVERSE(INDEX* N)) 1)) NL))
- (SETQ NL NIL)
- (COND ((NULL A)(RETURN 0)))
- (TB2 X (CAR A)N)
- TAG2
- (SETQ ML*(CONS (CONS NIL NIL)(CAR A)))
- (SETQ A (CDR A))
- (COND ((NULL A) (RETURN (COND ((= *DETSIGN* 1) (CADADR ML*))
- (T (GPCTIMES -1 (CADADR ML*)))))))
- (SETQ NML (CAR A))
- TAG1(COND((NULL NML)(GO TAG2)))
- (SETQ DD (CAR NML))
- (SETQ NML (CDR NML))
- (NBN DD)
- (GO TAG1)
- ))
-
- (DEFUN NBN (RULE)
- (declare (special x))
- (PROG (ANS R A)
- (SETQ ANS 0 R (CADAR RULE))
- (COND ((EQUAL R 0) (RETURN 0)))
- (RPLACA RULE (CAAR RULE))
- LOOP(COND((NULL R) (RETURN(RPLACD RULE(CONS ANS (CDR RULE))))))
- (SETQ A (CAR R) R(CDR R))
- (SETQ ANS(GPPLUS ANS
- (GPTIMES
- (COND ((= (CADR A) 1)
- (AREF X (CADDR A) (CADDDR A)))
- (T (GPCTIMES (CADR A) (AREF X (CADDR A) (CADDDR A)))))
- (GETMINOR (CAR A)))))
- (GO LOOP)))
-
- (DEFUN GETMINOR (INDEX)
- (COND((NULL(SETQ INDEX(zl-ASSOC INDEX ML*)))0)
- (T(RPLACD (CDR INDEX)(f1- (CDDR INDEX)))
- (COND((= (CDDR INDEX )0)
- (zl-DELETE INDEX ML*)))
- (CADR INDEX)))
- )
-
- (DEFUN TB2 (X L N)
- (DECLARE(FIXNUM N ))
- ; (setq x (get-array-pointer x))
- (PROG( ( N-1(f1- N)) B A)
- (DECLARE(FIXNUM N-1))
- LOOP(COND((NULL L) (RETURN NIL)))
- (SETQ A (CAR L) L (CDR L)B (CAR A))
- (RPLACD A (CONS (GPDIFFERENCE(GPTIMES (AREF X (CAR B) N-1) (AREF X (CADR B) N))
- (GPTIMES (AREF X (CAR B) N) (AREF X (CADR B) N-1)))
- (CDR A)))
- (GO LOOP)
- ))
-
- (DEFUN ZROW (X I COL N)
- (DECLARE(FIXNUM I COL N ))
- ; (setq x (get-array-pointer x))
- (PROG((J COL))
- (DECLARE(FIXNUM J))
- LOOP(COND((> J N)(RETURN T))
- ((EQUAL (AREF X I J) 0)(SETQ J(f1+ J))(GO LOOP)))
- ))
-
- (DEFUN NZL (A N)
- (DECLARE(FIXNUM N ))
-
- ; (setq a (get-array-pointer a))
- (PROG((I 0)( J (f- N 2)) D L)
- (DECLARE(FIXNUM I J))
- LOOP0(COND((= J 0) (RETURN L)))
- (SETQ I N)
- LOOP1(COND((= I 0) (SETQ L (CONS D L)) (SETQ D NIL)(SETQ J (f1- J))(GO LOOP0)))
- (COND((NOT(EQUAL (AREF A I J) 0))(SETQ D (CONS I D))))
- (SETQ I (f1- I))(GO LOOP1)
- ))
-
- (DEFUN SIGNNP (E L)
- (PROG(I)
- (SETQ I 1)
- LOOP (COND ((NULL L)(RETURN NIL))
- ((EQUAL E (CAR L)) (RETURN I)))
- (SETQ L(CDR L) I (f- I))
- (GO LOOP)
- ))
-
- (DEFUN MEMBERCAR (E L)
- (PROG()
- LOOP(COND((NULL L)(RETURN NIL))
- ((EQUAL E (CAAR L))(RETURN(RPLACD (CAR L) (f1+ (CDAR L))))))
- (SETQ L (CDR L))(GO LOOP)
- ))
-
- (DECLARE-TOP (UNSPECIAL X ML* RZL*))
-
- (DEFUN ATRANSPOSE (A N)
- (PROG(I J D) (SETQ I 0)
- LOOP1(SETQ I (f1+ I) J I)
- (COND ((> I N) (RETURN NIL)))
- LOOP2 (SETQ J (f1+ J))
- (COND ((> J N) (GO LOOP1)))
- (SETQ D (AREF A I J))
- (STORE (AREF A I J) (AREF A J I))
- (STORE (AREF A J I) D)
- (GO LOOP2)
- ))
-
- (DEFUN MXCOMP (L1 L2)
- (PROG()
- LOOP(COND((NULL L1)(RETURN T))
- ((CAR> (CAR L1) (CAR L2))(RETURN T))
- ((CAR> (CAR L2) (CAR L1))(RETURN NIL)))
- (SETQ L1 (CDR L1) L2 (CDR L2))(GO LOOP)
- ))
-
- (DEFUN PRMUSIGN (L)
- (PROG((B 0) A D)
- (DECLARE(FIXNUM B))
- LOOP (COND((NULL L)(RETURN (COND((EVEN B) 1)(T -1)))))
- (SETQ A (CAR L) L (CDR L) D L )
- LOOP1 (COND ((NULL D) (GO LOOP))
- ((> A (CAR D)) (SETQ B (f1+ B))))
- (SETQ D (CDR D))(GO LOOP1)
- ))
-
- (DEFUN DETPIVOT (X N)
- (PROG(R0 C0)
- (SETQ C0 (COLROW0 X N NIL) R0(COLROW0 X N T))
- (SETQ C0 (NREVERSE(BBSORT C0 (FUNCTION CAR>))))
- (SETQ R0 (NREVERSE(BBSORT R0 (FUNCTION CAR>))))
- (COND ((NOT(MXCOMP C0 R0))(ATRANSPOSE X N)(SETQ C0 R0)))
- (SETQ *DETSIGN* (PRMUSIGN (MAPCAR (FUNCTION CAR) C0)))
- (NEWMAT 'X* X N C0)
- (*REARRAY X)))
-
- (DEFUN NEWMAT(X Y N L)
- ; (setq y (get-array-pointer y))
- (PROG (I J JL)
- ;(set x (*ARRAY nil T (f1+ N) (f1+ N)))
- (set x (*ARRAY nil T (f1+ N) (f1+ N)))
- (setq x (get-array-pointer x))
- (SETQ J 0.)
- LOOP (SETQ I 0 J (f1+ J))
- (COND ((NULL L) (RETURN NIL)))
- (SETQ JL (CDAR L) L (CDR L))
- TAG (SETQ I (f1+ I))
- (COND ((> I N)(GO LOOP)))
- (STORE (AREF X I J) (AREF Y I JL))
- (GO TAG)))
-
- (DEFUN CAR> (A B) (> (CAR A) (CAR B)))
-
- (COMMENT IND=T FOR ROW ORTHERWISE COL)
-
- (DEFUN COLROW0 (A N IND)
- (DECLARE(FIXNUM N ))
- ; (setq a (get-array-pointer a))
- (PROG ((I 0) (J n) L (C 0))
- (DECLARE(FIXNUM i C J))
- LOOP0 (COND((= J 0) (RETURN L)))
- (SETQ I N)
- LOOP1 (COND ((= I 0)
- (SETQ L (CONS (CONS C J) L))
- (SETQ C 0.)
- (SETQ J (f1- J))
- (GO LOOP0)))
- (COND ((EQUAL (COND (IND (AREF A J I))
- (T (AREF A I J))) 0)
- (SETQ C (f1+ C))))
- (SETQ I (f1- I))(GO LOOP1)
- ))
-
- (DEFUN GPDIFFERENCE (A B)
- (COND ($RATMX (PDIFFERENCE A B))
- (T (SIMPLUS(LIST '(MPLUS) A (LIST '(MTIMES) -1 B)) 1 NIL))))
-
- (DEFUN GPCTIMES(A B) (COND ($RATMX (PCTIMES A B)) (T (SIMPTIMES(LIST '(MTIMES) A B) 1 NIL))))
-
- (DEFUN GPTIMES(A B) (COND ($RATMX (PTIMES A B)) (T(SIMPTIMES (LIST '(MTIMES) A B) 1 NIL))))
-
- (DEFUN GPPLUS(A B) (COND ($RATMX (PPLUS A B)) (T (SIMPLUS(LIST '(MPLUS) A B) 1 NIL))))
-
-